#ifndef MAGNUMTESTCASE_H_
#define MAGNUMTESTCASE_H_
//#include <cppunit/extensions/TestFactoryRegistry.h>
#include <cppunit/ui/text/TestRunner.h>
#include <cppunit/CompilerOutputter.h>
//#include <cppunit/TestCase.h>
#include <cppunit/extensions/HelperMacros.h>

class MagNumTestCase: public CppUnit::TestCase {

	CPPUNIT_TEST_SUITE( MagNumTestCase );
		CPPUNIT_TEST( testInitialization );
		CPPUNIT_TEST( testInitializationWithInt );
		CPPUNIT_TEST( testInitializationWithDouble );
		CPPUNIT_TEST( testInitializationWithChars );
		CPPUNIT_TEST( testGettingInt );
		CPPUNIT_TEST( testGettingIntNegative );
		CPPUNIT_TEST( testGettingIntFromPositiveDecimalRoundingDown );
		CPPUNIT_TEST( testGettingIntFromPositiveDecimalRoundingUp );
		CPPUNIT_TEST( testGettingIntFromNegativeDecimalRoundingDown );
		CPPUNIT_TEST( testGettingIntFromNegativeDecimalRoundingUp );
		CPPUNIT_TEST( testGettingDouble );
		CPPUNIT_TEST( testAssignmentOperator );
		CPPUNIT_TEST( testAssignmentOperatorChaining );
		CPPUNIT_TEST( testPlusEqualsOperator );
		CPPUNIT_TEST( testMinusEqualsOperator );
		CPPUNIT_TEST( testMulEqualsOperator );
		CPPUNIT_TEST( testDivEqualsOperator );
		CPPUNIT_TEST( testEqualsOperatorTrue );
		CPPUNIT_TEST( testEqualsOperatorFalse );
		CPPUNIT_TEST( testNotEqualsOperatorTrue );
		CPPUNIT_TEST( testNotEqualsOperatorFalse );
		CPPUNIT_TEST( testGreaterEqualsOperatorTrueWhenEqual );
		CPPUNIT_TEST( testGreaterEqualsOperatorTrueWhenGreater );
		CPPUNIT_TEST( testGreaterEqualsOperatorFalse );
		CPPUNIT_TEST( testLessEqualsOperatorTrueWhenEqual );
		CPPUNIT_TEST( testLessEqualsOperatorTrueWhenLess );
		CPPUNIT_TEST( testLessEqualsOperatorFalse );
		CPPUNIT_TEST( testGreaterOperatorTrue );
		CPPUNIT_TEST( testGreaterOperatorFalseWhenLess );
		CPPUNIT_TEST( testGreaterOperatorFalseWhenEqual );
		CPPUNIT_TEST( testLessOperatorTrue );
		CPPUNIT_TEST( testLessOperatorFalseWhenGreater );
		CPPUNIT_TEST( testLessOperatorFalseWhenEqual );
		CPPUNIT_TEST( testMinusOperatorWhenPositive );
		CPPUNIT_TEST( testMinusOperatorWhenNegative );
		CPPUNIT_TEST( testMinusOperatorWhenZero );
		CPPUNIT_TEST( testChangeSignWhenPositive );
		CPPUNIT_TEST( testChangeSignWhenNegative );
		CPPUNIT_TEST( testChangeSignWhenZero );
		CPPUNIT_TEST( testChangeSignTwoTimes );
		CPPUNIT_TEST( testAbsWhenPositive );
		CPPUNIT_TEST( testAbsWhenNegative );
		CPPUNIT_TEST( testAbsWhenZero );
		CPPUNIT_TEST( testGetAbsWhenPositive );
		CPPUNIT_TEST( testGetAbsWhenNegative );
		CPPUNIT_TEST( testGetAbsWhenZero );
		CPPUNIT_TEST( testPowWhenArgIsZero );
		CPPUNIT_TEST( testPowWhenZero );
		CPPUNIT_TEST( testPow );
		CPPUNIT_TEST( testGetPowWhenArgIsZero );
		CPPUNIT_TEST( testGetPowWhenZero );
		CPPUNIT_TEST( testGetPow );
		CPPUNIT_TEST( testB_both );
		CPPUNIT_TEST( testB );
		CPPUNIT_TEST( testBprime );
		CPPUNIT_TEST( testRange );
		CPPUNIT_TEST( testFactorialDivision );
//		CPPUNIT_TEST( testFaigenbaumConstant );
		CPPUNIT_TEST( testFaigenbaumConstantNoRecursion );
		CPPUNIT_TEST( testConverting );
		CPPUNIT_TEST( testBinaryAdding );
		CPPUNIT_TEST( testBinaryMultplying );
		CPPUNIT_TEST( testBinaryDividing );
		CPPUNIT_TEST( testBinarySqrting );
		CPPUNIT_TEST( testMagNumSqrtingErrorMeasure );
		CPPUNIT_TEST( testOver100Listener );
		CPPUNIT_TEST( testMandelbrot );
//		CPPUNIT_TEST( testAddingError );
//		CPPUNIT_TEST( testSubtractingError );
//		CPPUNIT_TEST( testMultiyplyingError );
//		CPPUNIT_TEST( testDividingError );
//		CPPUNIT_TEST( testBinaryDividing );
//		CPPUNIT_TEST( testBinaryDividing );
//		CPPUNIT_TEST( testBinaryDividing );


	CPPUNIT_TEST_SUITE_END();

	void testInitialization();
	void testInitializationWithInt();
	void testInitializationWithDouble();
	void testInitializationWithChars();

	// getInt()
	void testGettingInt();
	void testGettingIntNegative();
	void testGettingIntFromPositiveDecimalRoundingDown();
	void testGettingIntFromPositiveDecimalRoundingUp();
	void testGettingIntFromNegativeDecimalRoundingDown();
	void testGettingIntFromNegativeDecimalRoundingUp();

	// getDouble()
	void testGettingDouble();

	// = operator
	void testAssignmentOperator();
	void testAssignmentOperatorChaining();

	// += operator
	void testPlusEqualsOperator();
	// -= operator
	void testMinusEqualsOperator();
	// *= operator
	void testMulEqualsOperator();
	// /= operator
	void testDivEqualsOperator();

	// unary - operator
	void testMinusOperatorWhenPositive();
	void testMinusOperatorWhenNegative();
	void testMinusOperatorWhenZero();

	// == operator
	void testEqualsOperatorTrue();
	void testEqualsOperatorFalse();
	// != operator
	void testNotEqualsOperatorTrue();
	void testNotEqualsOperatorFalse();
	// >= operator
	void testGreaterEqualsOperatorTrueWhenEqual();
	void testGreaterEqualsOperatorTrueWhenGreater();
	void testGreaterEqualsOperatorFalse();
	// <= operator
	void testLessEqualsOperatorTrueWhenEqual();
	void testLessEqualsOperatorTrueWhenLess();
	void testLessEqualsOperatorFalse();
	// > operator
	void testGreaterOperatorTrue();
	void testGreaterOperatorFalseWhenEqual();
	void testGreaterOperatorFalseWhenLess();
	// < operator
	void testLessOperatorTrue();
	void testLessOperatorFalseWhenEqual();
	void testLessOperatorFalseWhenGreater();

	// changeSign()
	void testChangeSignWhenPositive();
	void testChangeSignWhenNegative();
	void testChangeSignWhenZero();
	void testChangeSignTwoTimes();

	// abs()
	void testAbsWhenPositive();
	void testAbsWhenNegative();
	void testAbsWhenZero();

	// getAbs()
	void testGetAbsWhenPositive();
	void testGetAbsWhenNegative();
	void testGetAbsWhenZero();

	// pow()
	void testPowWhenArgIsZero();
	void testPowWhenZero();
	void testPow();

	// getPow()
	void testGetPowWhenArgIsZero();
	void testGetPowWhenZero();
	void testGetPow();


	void testFaigenbaumConstant();
	void testFaigenbaumConstantNoRecursion();
	void testB_both();
	void testB();
	void testBprime();
	void testRange();
	void testFactorialDivision();

	void testConverting();
	void testBinaryAdding();
	void testBinaryMultplying();
	void testBinaryDividing();
	void testBinarySqrting();

	void testMagNumSqrtingErrorMeasure();


	void testOver100Listener();
	void testMandelbrot();


	void testAddingError();
	void testSubtractingError();
	void testMultiyplyingError();
	void testDividingError();

public:

	void setUp();
};

#endif /* MAGNUMTESTCASE_H_ */
